package top.xiaoazi.futureletterserver.utils;

import org.springframework.web.multipart.MultipartFile;
  
import java.io.File;  
import java.io.IOException;  
import java.nio.file.Files;  
import java.nio.file.Path;  
import java.nio.file.Paths;
import java.util.UUID;
  
public class FileUtils {

    /**
     * 保存文件到指定目录，文件名使用UUID生成，保留原文件扩展名。
     *
     * @param file       要保存的文件（MultipartFile）
     * @param directory  目标目录路径
     * @return 文件名
     * @throws IOException 如果保存文件时发生错误
     */
    public static String save(MultipartFile file, String directory) throws IOException {
        File dir = new File(directory);
        if (!dir.exists()) {
            dir.mkdirs(); // 创建目录，包括所有必需的父目录
        }

        // 生成UUID作为文件名的一部分
        String fileName = UUID.randomUUID().toString();

        // 如果提供了扩展名，则添加到文件名中
        if (file.getOriginalFilename() != null) {
            // 如果没有提供扩展名，则尝试从原始文件名中解析
            int lastIndexOfDot = file.getOriginalFilename().lastIndexOf('.');
            if (lastIndexOfDot > 0) {
                fileName += file.getOriginalFilename().substring(lastIndexOfDot);
            }
        } else {
            return null;
        }


        // 创建目标文件路径
        Path targetLocation = Paths.get(directory).resolve(fileName);

        // 保存文件
        Files.copy(file.getInputStream(), targetLocation);

        // 返回文件名
        return fileName;
    }

    /**  
     * 保存文件到指定目录，文件名使用UUID生成，保留原文件扩展名。  
     *  
     * @param file       要保存的文件（MultipartFile）  
     * @param directory  目标目录路径
     * @param extension  文件扩展名（可选，如果已知则提供以避免解析错误）
     * @return 文件名
     * @throws IOException 如果保存文件时发生错误  
     */  
    public static String save(MultipartFile file, String directory, String extension) throws IOException {
        File dir = new File(directory);
        if (!dir.exists()) {
            dir.mkdirs(); // 创建目录，包括所有必需的父目录
        }

        // 生成UUID作为文件名的一部分  
        String fileName = UUID.randomUUID().toString();  
  
        // 如果提供了扩展名，则添加到文件名中  
        if (extension != null && !extension.isEmpty()) {  
            fileName += "." + extension;  
        } else if (file.getOriginalFilename() != null) {  
            // 如果没有提供扩展名，则尝试从原始文件名中解析  
            int lastIndexOfDot = file.getOriginalFilename().lastIndexOf('.');  
            if (lastIndexOfDot > 0) {  
                fileName += file.getOriginalFilename().substring(lastIndexOfDot);  
            }  
        }  
  
        // 创建目标文件路径  
        Path targetLocation = Paths.get(directory).resolve(fileName);  
  
        // 保存文件  
        Files.copy(file.getInputStream(), targetLocation);  
  
        // 返回文件名
        return fileName;
    }

    /**
     * 删除指定目录及其子目录中名为fileName的文件。
     * 如果文件不存在，则不会报错。
     *
     * @param directoryPath 目录的路径
     * @param fileName      要删除的文件名
     */
    public static boolean delete(String directoryPath, String fileName) {
        File directory = new File(directoryPath);
        if (directory.exists() && directory.isDirectory()) {
            File[] files = directory.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        // 如果是目录，则递归调用
                        delete(file.getAbsolutePath(), fileName);
                    } else if (file.getName().equals(fileName)) {
                        // 如果找到文件，则删除
                        return file.delete();
                    }
                }
            }
        } else {
            return false;
        }
        return false;
    }

    // 你还可以添加其他文件操作的方法...

    /**
     * 传递文件路径获取文件名
     * @param url
     * @return
     */
    public static String getFileNameByUrl(String url) {
        return url.substring(url.lastIndexOf('/') + 1);
    }
}